package com.cqq.boot.base;

import java.net.InetAddress;
import java.net.UnknownHostException;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;

public abstract class BaseController {
	
	protected final Logger log = LoggerFactory.getLogger(this.getClass());
	
	/**
	 * 消息对象key（页面展示用）
	 */
    protected static final String MESSAGE_KEY="message";
    
	/**
	 * 消息类型：成功
	 */
    protected static final String MESSAGE_TYPE_SUCCESS="success";
    
	/**
	 * 消息类型：失败
	 */    
    protected static final String MESSAGE_TYPE_ERROR="error";

	/**
	 * 消息类型：信息提示
	 */
    protected static final String MESSAGE_TYPE_INFO="info";
    
	/**
	 * 消息类型：警告
	 */
    protected static final String MESSAGE_TYPE_WARNING="warning";
    
	/**
	 * 消息类型：问题
	 */
    protected static final String MESSAGE_TYPE_QUESTION="question";
    
	/**
	 * <h3>按viewName 返回 ModelAndView 对象</h3>
	 * 
	 * @param viewName 视图名称 
	 * 
	 * @return ModelAndView 对象
	 * 
	 */
    protected ModelAndView view(String viewName){
    	return new ModelAndView(viewName);
    }
    
	/**
	 * <h3>指定消息类型和内容返回 ModelAndView 对象</h3>
	 * 
	 * @param type 消息类型（成功、失败、信息提示、警告）
	 * @param msg 消息内容文本
	 * 
	 * @return ModelAndView 对象
	 * 
	 */
    protected ModelAndView message(String type,String msg){
    	MessageBean message=this.buildMessage(type, msg);
    	return view("/common/message").addObject(MESSAGE_KEY,message);
    }
    
	/**
	 * <h3>指定消息类型和内容返回 MessageBean 对象，可用于json返回封装</h3>
	 * 
	 * @param type 消息类型
	 * @param message 消息内容文本
	 * 
	 * @return MessageBean 对象
	 * 
	 */
    protected MessageBean buildMessage(String type,String message){
		MessageBean msg=new MessageBean();
		msg.setType(type);
		msg.setMessage(message);
		return msg;
    }

	/**
	 * <h3>指定消息类型、代码、内容返回 MessageBean 对象，可用于json返回封装</h3>
	 * 
	 * @param type 消息类型
	 * @param code 消息代码
	 * @param message 消息内容文本
	 * 
	 * @return MessageBean 对象
	 * 
	 */
    protected MessageBean buildMessage(String type, String code, String message){
		MessageBean msg=new MessageBean();
		msg.setType(type);
		msg.setCode(code);
		msg.setMessage(message);
		return msg;
    }
    
	/**
	 * <h3>指定消息类型和内容返回 MessageBean 对象，可用于json返回封装</h3>
	 * 
	 * @param type 消息类型
	 * @param message 消息内容文本
	 * @param data 消息需要显示的数据对象
	 * 
	 * @return MessageBean 对象
	 * 
	 */
    protected MessageBean buildMessage(String type,String message,Object data){
		MessageBean msg=this.buildMessage(type, message);
		msg.setData(data);
		return msg;
    }

	/**
	 * <h3>指定消息类型、代码和内容返回 MessageBean 对象，可用于json返回封装</h3>
	 * 
	 * @param type 消息类型
	 * @param code 消息代码
	 * @param message 消息内容文本
	 * @param data 消息需要显示的数据对象
	 * 
	 * @return MessageBean 对象
	 * 
	 */
    protected MessageBean buildMessage(String type,String code,String message,Object data){
		MessageBean msg=this.buildMessage(type, code, message);
		msg.setData(data);
		return msg;
    }
    
	/**
	 * <h3>获取IP地址</h3>
	 * 
	 * @param request HttpServletRequest对象
	 * 
	 * @return String IP地址
	 * 
	 */
    protected String getIPAddress(HttpServletRequest request) {
		String ip = request.getHeader("x-forwarded-for");
		log.debug("x-forwarded-for=" + ip);
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
			log.debug("Proxy-Client-IP=" + ip);
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
			log.debug("WL-Proxy-Client-IP=" + ip);
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("x-real-ip");
			log.debug("x-real-ip=" + ip);
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
			log.debug("request.getRemoteAddr()=" + ip);
			if (ip.equals("127.0.0.1")
					|| ip.equals("0:0:0:0:0:0:0:1")) {
				// 根据网卡取本机配置的IP
				try {
					InetAddress inet = InetAddress.getLocalHost();
					ip = inet.getHostAddress();
					log.debug("local ip:{}",ip);
				} catch (UnknownHostException e) {
					log.error(e.getMessage(),e);
				}
			}			
		}
		// 对于通过多个代理的情况，第一个IP为客户端真实IP,多个IP按照','分割
		if (ip != null && ip.length() > 15) {
			if (ip.indexOf(",") > 0) {
				ip = ip.substring(0, ip.indexOf(","));
				log.debug("client ip:{}",ip);
			}
		}
		return ip;
	}

}
